package thread.unit3.learn;

/**
 * 演示线程的死锁问题
 *
 * 1.死锁的理解：不同的线程分别占用对方需要的同步资源不放弃，
 * 都在等待对方放弃自己需要的同步资源，就形成了线程的死锁
 *
 * 2.说明：
 * 1）出现死锁后，不会出现异常，不会出现提示，只是所有的线程都处于阻塞状态，无法继续
 * 2）我们使用同步时，要避免出现死锁。
 */

public class DeadStockDemo1 {

    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer();
        StringBuffer s2 = new StringBuffer();

        Thread t1 = new Thread(){
            @Override
            public void run() {
                synchronized(s1){
                    s1.append(1);
                    s2.append("a");
                }
                synchronized (s2){
                    s1.append(2);
                    s2.append("b");
                }
                System.out.println(s1);
                System.out.println(s2);
            }
        };

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized(s2){
                    s1.append(3);
                    s2.append("c");
                }
                synchronized (s1){
                    s1.append(4);
                    s2.append("d");
                }
                System.out.println(s1);
                System.out.println(s2);
            }
        });
        t1.setPriority(8);
        t2.setPriority(6);

        t1.start();
        t2.start();
    }
}
